#ifndef USERMANAGER_H
#define USERMANAGER_H

#include "User.h"
#include "SessionInfo.h"
#include <map>
#include <string>
#include <chrono>


class UserManager {
public:
    static UserManager& getInstance();
    int generateNewUserId();
    bool registerUser(const std::string& username, const std::string& password, User::Role role); // 声明
    bool loginUser(const std::string& username, const std::string& password);
    void logoutUser(int userId);
    User* getUser(int userId);
    User* getUserByUsername(const std::string& username);

    // 管理员功能：管理用户
    bool addUser(const std::string& username, const std::string& password, User::Role role);
    bool deleteUser(int userId);
    bool updateUserRole(int userId, User::Role role);

    std::string simpleHash(const std::string& input); // 声明 simpleHash 函数

    // 检查是否处于锁定状态
    bool isSystemLocked() const {
        if (isLocked) {
            auto now = std::chrono::system_clock::now();
            auto lockoutEnd = globalLockoutTime + std::chrono::seconds(LOCKOUT_DURATION);
            if (now < lockoutEnd) {
                return true; // 系统仍处于锁定状态
            } else {
                // 锁定时间已过，重置状态
                const_cast<UserManager*>(this)->globalLoginAttempts = 0;
                const_cast<UserManager*>(this)->isLocked = false;
            }
        }
        return false; // 系统未锁定
    }

    // 用户登录时记录会话信息
    void recordLogin(int userId, const std::string& ipAddress);

    // 用户操作时更新最后活动时间
    void updateActivityTime(int userId);

    // 检查会话是否过期
    bool isSessionExpired(int userId);

    // 清理过期会话
    void cleanExpiredSessions();   


private:
    UserManager();
    ~UserManager();

    
    bool verifyPassword(const std::string& password, const std::string& passwordHash);

    std::map<int, User> users;
    std::map<int, SessionInfo> sessions;  // 存储会话信息
    const std::chrono::seconds sessionTimeout = std::chrono::seconds(30);  // 会话超时时间，例如 5 分钟
    // 登录次数限制
    std::map<std::string, int> loginAttempts; // 记录每个用户的登录尝试次数
    std::map<std::string, std::chrono::system_clock::time_point> lockoutTime; // 记录用户被锁定的时间
    int globalLoginAttempts = 0;
    std::chrono::system_clock::time_point globalLockoutTime;
    static const int MAX_LOGIN_ATTEMPTS; // 最大登录尝试次数
    static const int LOCKOUT_DURATION; // 锁定时间（秒）
    bool isLocked = true;
};

#endif // USERMANAGER_H
